package com.zzyl.common.utils.pdf;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

public class PdfTextExtractor {

    /**
     * 从文件路径提取 PDF 文本
     *
     * @param filePath PDF 文件路径
     * @return 提取的文本内容
     * @throws IOException 如果文件不存在或解析失败
     */
    public static String extractTextFromFile(String filePath) throws IOException {
        return extractTextFromFile(new File(filePath));
    }

    /**
     * 从 File 对象提取 PDF 文本
     *
     * @param file PDF 文件对象
     * @return 提取的文本内容
     * @throws IOException 如果文件不存在或解析失败
     */
    public static String extractTextFromFile(File file) throws IOException {
        try (PDDocument document = PDDocument.load(file)) {
            return extractTextFromDocument(document);
        }
    }

    /**
     * 从 InputStream 提取 PDF 文本（适用于上传流、网络流等）
     *
     * @param inputStream PDF 输入流
     * @return 提取的文本内容
     * @throws IOException 如果流无效或解析失败
     */
    public static String extractTextFromStream(InputStream inputStream) throws IOException {
        try (PDDocument document = PDDocument.load(inputStream)) {
            return extractTextFromDocument(document);
        }
    }

    /**
     * 核心方法：从 PDDocument 提取文本
     *
     * @param document 已加载的 PDF 文档
     * @return 文本内容
     * @throws IOException 解析异常
     */
    private static String extractTextFromDocument(PDDocument document) throws IOException {
        if (document.isEncrypted()) {
            // 可选：尝试解密（无密码则跳过或抛异常）
            try {
                document.setAllSecurityToBeRemoved(true);
            } catch (Exception e) {
                throw new IOException("PDF is encrypted and cannot be decrypted without password.", e);
            }
        }

        PDFTextStripper pdfStripper = new PDFTextStripper();

        // 可选配置（按需启用）
        // pdfStripper.setSortByPosition(true); // 按位置排序，更接近视觉顺序
        // pdfStripper.setStartPage(1);         // 设置起始页
        // pdfStripper.setEndPage(5);           // 设置结束页

        return pdfStripper.getText(document);
    }

    // ========== 示例用法 ==========
    public static void main(String[] args) {
        try {
            String text = extractTextFromFile("D:/code/zhongzhou/third/体检报告-刘爱国-男-69岁.pdf");
            System.out.println("=== PDF Content ===");
            System.out.println(text);
        } catch (IOException e) {
            System.err.println("Error extracting PDF text: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
